﻿using System;
using NHibernate;
using CRC.Incidencias.Dominio.Clases;
using System.Collections.Generic;

namespace CRC.Incidencias.Dominio.Controladores
{
    class ControladorListarConceptos
    {
        public LinkedList<Object[]> Listar(){
            ISession session = null;
            ITransaction tx = null;
            LinkedList<Object[]> conceptos = new LinkedList<Object[]>();

            try 
            {
                session = NHibernate.NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();
                IList<Concepto> arrels = session.CreateQuery("from Concepto as c where c.Padre is null order by c.Codigo").List<Concepto>();

                foreach (Concepto c in arrels) 
                { 
                    Object[] conc = new Object[3]; // id, desc, lista hijos
                    conc[0] = c.Codigo;
                    conc[1] = c.Descripcion;
                    LinkedList<Object[]> hijos = new LinkedList<Object[]>();
                    conc[2] = hijos;
                    conceptos.AddLast(conc);
                    CargarHijos_Rec(c, hijos); //recursivo
                }
                tx.Commit();

                return conceptos;

            } catch(HibernateException he){
                if (tx != null)
                {
                    tx.Rollback();
                    session.Close();
                }
                throw he;
            }
        } 

        private void CargarHijos_Rec(Concepto c, LinkedList<Object[]> hijos)
        {
            foreach (Concepto hijo in c.Hijos)
            { 
                Object[] infoHijo = new Object[3];
                infoHijo[0] = hijo.Codigo;
                infoHijo[1] = hijo.Descripcion;
                LinkedList<Object[]> masHijos = new LinkedList<Object[]>();
                infoHijo[2] = masHijos;
                CargarHijos_Rec(hijo, masHijos);
                hijos.AddLast(infoHijo);

            }
        }
    }
}
